/**
 * axios 封装
 */
import axios from "axios";
import {
	showLoadingToast,
	showDialog
} from 'vant';
import { getTokenLocal } from "@/utils/auth.js"
// 创建一个 axios 实例
const service = axios.create({
	withCredentials: true, // send cookies when cross-domain requests
	baseURL: import.meta.env.VITE_APIDomainName, //http://www.zjff495.cn:5050
	timeout: 5000, // 设定响应超时
});

let toast = null
/**
 * 请求拦截器
 */
service.interceptors.request.use((config) => {
	// 让Axios调用携带Token
	const token = getTokenLocal();
	if (token)
		config.headers.authorization = token; //token的名字参见接口文档 

	// 在发送请求之前做些什么  
	toast = showLoadingToast({
		message: '加载中...',
		forbidClick: true,
	}); // 显示loading
	return config;
}, (error) => { // 处理请求错误 
	toast && toast.close(); // 隐藏loading  
	return Promise.reject(error);
});

/**
 * 响应拦截器，
 * 每次响应的格式
 * { code => 状态码, msg => '响应信息', data => 数据 }
 */
service.interceptors.response.use((response) => {
	toast && toast.close(); // 隐藏loading
	const result = response.data; //注意后端返回的数据格式 result = { code msg data }
	if (result.code == 1) { //注意返回的code值的含义
		return Promise.resolve(result); //返回成功  
	}

	// 处理Token错,需要重新登录
	if (result.code === 401) {
		// Token错,需要重新登录
		showDialog({
			title: "用户需要登录！",
			message: result.msg,
		});
		return Promise.reject(new Error(result.msg || "Token错,需要重新登录"));
	}

	// 处理其他错误
	showDialog({
		title: "响应错误",
		message: result.msg
	});
	return Promise.reject(new Error(result.msg || "未知的响应错误"));

}, (error) => {
	console.error("响应出错:" + error); //控制台错误提示  
	toast && toast.close(); // 隐藏loading
	showDialog({ // 全局错误提示
		title: "响应拦截器错误",
		message: error.message
	});
	return Promise.reject(error);
});

//默认引出
export default service;